package editeurGraphiti.features;

import modeleProcessus.Acteur;
import modeleProcessus.Activite;
import modeleProcessus.Processus;

import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.IMoveShapeContext;
import org.eclipse.graphiti.features.context.impl.AddConnectionContext;
import org.eclipse.graphiti.features.impl.DefaultMoveShapeFeature;
import org.eclipse.graphiti.mm.pictograms.Shape;

public class MoveActiviteIntoActeurFeature extends DefaultMoveShapeFeature {

	public MoveActiviteIntoActeurFeature(IFeatureProvider fp) {
		super(fp);
	}

	@Override
	public boolean canMoveShape(IMoveShapeContext context) {
		boolean canMove = super.canMoveShape(context);
		Shape targetShape = (Shape) context.getTargetContainer();
		Shape sourceShape = context.getShape();

		Object targetBo = getBusinessObjectForPictogramElement(targetShape);
		Object sourceBo = getBusinessObjectForPictogramElement(sourceShape);

		if (targetBo instanceof Acteur) {
			// Si cible = acteur et que l'acteur n'a pas l'activite
			Acteur acteur = (Acteur) targetBo;
			Activite activite = (Activite) sourceBo;
			return !acteur.getActivite().contains(activite);
		} else if (targetBo instanceof Processus) {
			return true;
		}
		return canMove;
	}

	@Override
	public void moveShape(IMoveShapeContext context) {
		super.moveShape(context);
		// L'acteur n'a pas l'activite
		// On l'ajoute donc au domain modele
		Object targetBo = getBusinessObjectForPictogramElement((Shape) context
				.getTargetContainer());
		if (targetBo instanceof Acteur) {
			Acteur acteur = (Acteur) targetBo;
			acteur.getActivite().add(
					(Activite) getBusinessObjectForPictogramElement(context
							.getShape()));
			// Adding connection
			getFeatureProvider().addIfPossible(
					new AddConnectionContext(((Shape) context
							.getTargetContainer()).getAnchors().get(0), context
							.getShape().getAnchors().get(0)));
		}

	}
}
